package com.example.demo.arithmetic.algorithm.stack;

import java.util.Stack;

/**
 * Description: 栈计算后缀表达式<br/>
 *
 * @author Sender<br />;
 * @taskId <br/>
 * @Date 2019/5/14 11:33
 * @Version 1.0
 */
public class StackTest {
    private static final char ADD = '+';

    private static final char SUB = '-';

    private static final char MUL = '*';

    private static final char DIV = '/';

    private static Stack<Integer> stack = new Stack<Integer>();

    /**
     * 后缀表达式就是：操作符位于两个操作数之后，后缀表达式的形式如下：<操作数><操作数><操作符>
     * 中缀表达式就是：操作符位于操作数之间。中缀表达式的形式如下：<操作数><操作符><操作数>
     */
    public static int evaluate(String expr) {
        // 将字符串分解,\s 匹配任何空白字符，包括空格、制表符、换页符等。
        String[] tokenizer = expr.split("\\s");//
        for (int i = 0; i < tokenizer.length; i++) {
            String token = tokenizer[i].trim();
            if (isOperator(token)) {    // 判断是操作符，则出栈两个操作数
                int op2 = stack.pop().intValue();
                int op1 = stack.pop().intValue();
                char operator = token.charAt(0);
                stack.push(calc(operator, op1, op2));
            } else {
                stack.push(Integer.parseInt(token));
            }
        }

        return stack.pop();    // 将最后的计算结果返回
    }

    private static Integer calc(char operation, int op1, int op2) {
        int result = 0;
        switch (operation) {
            case ADD:
                result = op1 + op2;
                break;
            case SUB:
                result = op1 - op2;
                break;
            case MUL:
                result = op1 * op2;
                break;
            case DIV:
                result = op1 / op2;
                break;
        }
        return result;

    }

    private static boolean isOperator(String token) {
        return (token.equals("+") || token.equals("-") || token.equals("*") || token
                .equals("/"));
    }

    public static void main(String[] args) {
        String expression = "3 2 2 * + 1 -";
        String expression2 = "3 4 + 5 * 6 -";
        int result = evaluate(expression2);
        System.out.println("计算结果为：" + result);
    }

}
